
#include <view/Janela.h>
#include <view/Texto.h>
#include <view/Fonte.h>
#include <view/Editor.h>


Editor::Editor(int cx, int cy, int x, int y)
    : Controle(cx,cy,x,y),
      m_fonte(NULL)
{
    MatrizRGBA& matriz = Matriz();
    
    this->Fonte("verdana", 16, RGBA(0,0,0,255));

    for(int i=1; i<Largura()-1; i++)
    {
        matriz[i][1] = RGBA(0,0,0,255);
        matriz[i][Altura()-2] = RGBA(0,0,0,255);
    }
    for(int j=1; j<Altura()-1; j++)
    {
        matriz[1][j] = RGBA(0,0,0,255);
        matriz[Largura()-2][j] = RGBA(0,0,0,255);
    }
}

Editor::~Editor()
{
    if(m_fonte)
        delete m_fonte;
}

bool Editor::AoTeclar(EventoTeclar ev)
{
    MatrizRGBA& matriz = Matriz();
    
    unsigned char ch = ev.c;
    switch(ch)
    {
    case 13:
        break;
        //m_strTexto += '\n';
        //break;
    case 8:
        m_strTexto = m_strTexto.substr(0, m_strTexto.size()-1);
        break;
    default:
        m_strTexto += ch;
    };
  
    
    this->Reescrever();

    int cor1 = RGBA(241,204,131,255);
    int cor2 = RGBA(  0,  0,  0,255);
    
    for(int i=0; i<Largura(); i++)
    {
        matriz[i][0] = cor1;
        matriz[i][Altura()-1] = cor1;
    }
    for(int j=0; j<Altura(); j++)
    {
        matriz[0][j] = cor1;
        matriz[Largura()-1][j] = cor1;
    }

    for(int i=1; i<Largura()-1; i++)
    {
        matriz[i][1] = cor2;
        matriz[i][Altura()-2] = cor2;
    }
    for(int j=1; j<Altura()-1; j++)
    {
        matriz[1][j] = cor2;
        matriz[Largura()-2][j] = cor2;
    }

    ev.janela->Redesenhar(this);

	return false;
}

bool Editor::AoFocar(EventoFocar ev)
{
    MatrizRGBA& matriz = Matriz();

    int cor1 = RGBA(241,204,131,255);
    int cor2 = RGBA(  0,  0,  0,255);
    
    for(int i=0; i<Largura(); i++)
    {
        matriz[i][0] = cor1;
        matriz[i][Altura()-1] = cor1;
    }
    for(int j=0; j<Altura(); j++)
    {
        matriz[0][j] = cor1;
        matriz[Largura()-1][j] = cor1;
    }

    for(int i=1; i<Largura()-1; i++)
    {
        matriz[i][1] = cor2;
        matriz[i][Altura()-2] = cor2;
    }
    for(int j=1; j<Altura()-1; j++)
    {
        matriz[1][j] = cor2;
        matriz[Largura()-2][j] = cor2;
    }

    ev.janela->Redesenhar(this);

	return false;
}

bool Editor::AoOfuscar(EventoOfuscar ev)
{
    MatrizRGBA& matriz = Matriz();

    int cor1 = RGBA(0,0,0,0);
    int cor2 = RGBA(  0,  0,  0,255);
    
    for(int i=0; i<Largura(); i++)
    {
        matriz[i][0] = cor1;
        matriz[i][Altura()-1] = cor1;
    }
    for(int j=0; j<Altura(); j++)
    {
        matriz[0][j] = cor1;
        matriz[Largura()-1][j] = cor1;
    }

    for(int i=1; i<Largura()-1; i++)
    {
        matriz[i][1] = cor2;
        matriz[i][Altura()-2] = cor2;
    }
    for(int j=1; j<Altura()-1; j++)
    {
        matriz[1][j] = cor2;
        matriz[Largura()-2][j] = cor2;
    }

    ev.janela->Redesenhar(this);

	return false;
}

void Editor::Reescrever()
{
    ::MatrizRGBA& matriz = Matriz();
    ::Fonte& fonte = *m_fonte;

    for(int i=0; i<this->Largura(); i++)
        for(int j=0; j<this->Altura(); j++)
            matriz[i][j] = RGBA(0,0,0,0);

    int offset_x = 0;
    int offset_y = 0;
    for(unsigned i=0; i<m_strTexto.size(); i++)
    {
        if(m_strTexto[i] == '\n')
        {
            offset_x = 0;
            offset_y += fonte.Tamanho();
            continue;
        }
        MatrizRGBA& matrizChar = fonte[m_strTexto[i]]->Matriz();
        matriz.Mesclar(4+offset_x, 2+offset_y, matrizChar, 0, 0,
                       matrizChar.Largura(), matrizChar.Altura());
        offset_x += fonte[m_strTexto[i]]->Largura();
    }
    
    // Cursor
    for(int i=0; i<13; i++)
    matriz[offset_x+5][offset_y+4+i] = RGBA(0,0,0,255);
}


void Editor::Fonte(std::string strFonte, int tamanho, int cor)
{
     if(m_fonte)
         delete m_fonte;
     
     m_fonte = new ::Fonte(strFonte.c_str(), tamanho, cor);

     this->Reescrever();
}


